package br.com.monitorimoveis.batch;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import br.com.monitorimoveis.batch.parser.GeradorURLsPesquisaWImoveis;
import br.com.monitorimoveis.batch.parser.ResultadoPesquisa;
import br.com.monitorimoveis.batch.parser.WImoveisParser;
import br.com.monitorimoveis.comum.entidade.Anuncio;
import br.com.monitorimoveis.comum.entidade.Estado;
import br.com.monitorimoveis.comum.entidade.InfoColeta;
import br.com.monitorimoveis.comum.servico.ICidadeService;
import br.com.monitorimoveis.comum.servico.IColetorAnuncios;
import br.com.monitorimoveis.comum.servico.IEstadoService;

public class ColetaWImoveisService implements IColetorAnuncios {

	private WImoveisParser parser = new WImoveisParser();

	private IEstadoService servicoEstado = (IEstadoService) Contexto.get()
			.getBean("estadoService");

	public ColetaWImoveisService() {
	}

	/**
	 * Obtem as URLs dos anúncios para que esses anúncios possam ser coletados
	 * posteriormente via requisição http.
	 * 
	 * @return
	 */
	public List<InfoColeta> coletarURLsAnuncios() {

		List<InfoColeta> urls = new ArrayList<InfoColeta>();

		Estado estado = servicoEstado.getBySigla("DF");
		
		GeradorURLsPesquisaWImoveis gerador = new GeradorURLsPesquisaWImoveis(estado);

		String url = null;

		while (gerador.temMaisURLs()) {

			url = gerador.proximaURL();

			// urls.addAll(obterURLsAnuncioDoResultadoPesquisaPorListagem(url));
			urls.addAll(obterURLsAnuncioDoResultadoPesquisaPorGaleria(url));
		}

		return urls;
	}

	private List<InfoColeta> obterURLsAnuncioDoResultadoPesquisaPorGaleria(
			String url) {

		List<InfoColeta> urlsDoResultadoPesquisa = new ArrayList<InfoColeta>();

		try {

			int numPaginas = pesquisar(url).getNumPaginas();

			int paginaAtual = 0;

			while (paginaAtual < numPaginas) {

				try {
					 System.out.println("************* Obtendo PÁGINA "
					 + (paginaAtual + 1) + " *************");
					Document doc2 = Jsoup.connect(url + paginaAtual).get();
					Thread.sleep(300);

					Elements tags = doc2.select(".listagem_foto");

					for (Element tag : tags) {
						try {
							InfoColeta infoAnuncio = parser
									.obterURLColetaAnuncio(tag);

							if (infoAnuncio != null) {
								urlsDoResultadoPesquisa.add(infoAnuncio);
							}

						} catch (Exception e) {
							e.printStackTrace();
						}
					}

				} catch (IOException e) {
					// System.out.println("Erro ao buscar página: " + url);
					e.printStackTrace();
				} catch (InterruptedException e) {
					System.out.println("Erro em Thread.sleep()");
					e.printStackTrace();
				} catch (Exception e) {
					System.out.println("Erro: " + e.getMessage());
					e.printStackTrace();
				} finally {
					paginaAtual++;
				}

			}

		} catch (Exception e) {
			System.out.println("Erro ao obter primeira página!");
			e.printStackTrace();
		}

		return urlsDoResultadoPesquisa;
	}

	/**
	 * Realiza a pesquisa no site por um determinado URL Essa pesquisa inicial é
	 * feita apenas para obter o número de páginas retornado na consulta.
	 * 
	 * @param urlPesquisa
	 * @return
	 * @throws IOException
	 */
	private ResultadoPesquisa pesquisar(String urlPesquisa) throws Exception {
		ResultadoPesquisa result = new ResultadoPesquisa();

		Document doc = Jsoup.connect(urlPesquisa).get();

		String query = "#ctl00_Resultado_ResultadoGaleriaUC1_NavegacaoUC1_labelPaginas";

		System.out.println(urlPesquisa);

		int numPaginas = Integer.parseInt(doc.select(query).first().text());

		// System.out.println("NÚMERO DE PÁGINAS: " + numPaginas);

		result.setDocumentoHTML(doc);
		result.setNumPaginas(numPaginas);

		return result;
	}

	/**
	 * Responsável pela coleta de um anuncio na web.
	 * 
	 * @param url
	 *            Endereço web do anúncio.
	 * @return Anuncio
	 * @throws Exception
	 */
	public Anuncio coletarAnuncio(String url) throws Exception {
		Document doc = Jsoup.connect(url).get();
		return parser.parse(doc, url);
	}

	//
	// private List<InfoColetaAnuncio>
	// obterURLsAnuncioDoResultadoPesquisaPorListagem(
	// String url) {
	//
	// List<InfoColetaAnuncio> urlsDoResultadoPesquisa = new
	// ArrayList<InfoColetaAnuncio>();
	//
	// try {
	//
	// int numPaginas = pesquisarPorListagem(url).getNumPaginas();
	//
	// int paginaAtual = 0;
	//
	// // TODO Retirar... foi inserido apenas para não gerar muitas
	// // requisições já que estou fazendo testes...
	// if (numPaginas > 3) {
	// numPaginas = 3;
	// }
	//
	// while (paginaAtual < numPaginas) {
	//
	// try {
	// System.out.println("************* Obtendo PÁGINA "
	// + (paginaAtual + 1) + " *************");
	// Document doc2 = Jsoup.connect(url + paginaAtual).get();
	// Thread.sleep(1000);
	//
	// Elements tags = doc2.select(".listagem_item");
	//
	// for (Element tag : tags) {
	// try {
	// InfoColetaAnuncio infoAnuncio = WImoveisParser
	// .obterURLColetaAnuncio(tag);
	//
	// if (infoAnuncio != null) {
	// urlsDoResultadoPesquisa.add(infoAnuncio);
	// }
	//
	// } catch (Exception e) {
	// e.printStackTrace();
	// }
	// }
	//
	// } catch (IOException e) {
	// System.out.println("Erro ao buscar página: " + url);
	// e.printStackTrace();
	// } catch (InterruptedException e) {
	// System.out.println("Erro em Thread.sleep()");
	// e.printStackTrace();
	// } catch (Exception e) {
	// System.out.println("Erro: " + e.getMessage());
	// e.printStackTrace();
	// } finally {
	// paginaAtual++;
	// }
	//
	// }
	//
	// } catch (IOException e) {
	// System.out.println("Erro ao obter primeira página!");
	// e.printStackTrace();
	// }
	//
	// return urlsDoResultadoPesquisa;
	// }

}
